// ITF.js
// Interleaved 2 of 5 条码编码器
// 支持任意偶数位数字字符串

import Barcode from '../Barcode.js';
import { START_BIN, END_BIN, BINARIES } from './constants.js';

/**
 * Interleaved 2 of 5 (ITF) 条码类
 * 特点：
 * - 仅支持数字
 * - 长度必须为偶数
 * - 高密度，常用于物流和仓储
 * - 条代表奇数位，空代表偶数位（交错编码）
 */
class ITF extends Barcode {
  /**
   * 构造函数
   * @param {string} data - 输入数据（必须为偶数位数字）
   * @param {Object} options - 条码配置项
   */
  constructor(data, options) {
    super(data, options);
  }

  /**
   * 验证输入数据是否有效
   * 必须是偶数个数字
   * @returns {boolean}
   */
  valid() {
    return /^([0-9]{2})+$/.test(this.data);
  }

  /**
   * 编码核心方法
   * 将数据成对编码，使用“交错”方式（条=奇数位，空=偶数位）
   * @returns {{ data: string, text: string }}
   */
  encode() {
    // 将数据每两位分组
    const pairs = this.data.match(/.{2}/g);

    // 对每一对数字进行编码
    const encoded = pairs.map(pair => this.encodePair(pair)).join('');

    return {
      data: START_BIN + encoded + END_BIN,
      text: this.text
    };
  }

  /**
   * 编码一对数字
   * 第一个数字用“条”表示，第二个用“空”表示（交错）
   * @param {string} pair - 两位数字字符串，如 '12'
   * @returns {string} 二进制编码
   */
  encodePair(pair) {
    const [firstDigit, secondDigit] = pair;
    const firstBinary = BINARIES[parseInt(firstDigit, 10)]; // 条（黑）
    const secondBinary = BINARIES[parseInt(secondDigit, 10)]; // 空（白）

    // 交错编码：每一位上，条宽/窄 + 空宽/窄
    return firstBinary.split('').map((barBit, index) => {
      const bar = barBit === '1' ? '111' : '1';       // 宽条 = '111', 窄条 = '1'
      const space = secondBinary[index] === '1' ? '000' : '0'; // 宽空 = '000', 窄空 = '0'
      return bar + space;
    }).join('');
  }
}

export default ITF;